from models.mbrs import MBR
from db.repositories.base import BaseRepository
from motor.motor_asyncio import AsyncIOMotorDatabase

class MBRSRepository(BaseRepository[MBR]):
    def __init__(self, db: AsyncIOMotorDatabase):
        super().__init__("mbrs", db) 

    async def get_by_mbr_no(self, mbr_no: str) -> MBR:
        """
        获取数据
        """
        return await self.collection.find_one({"MBR_NO": mbr_no})
    
    async def create_or_update_withfraud(self, mbr: MBR, fraud_bool: bool, rb_id: float) -> MBR:
        """
        创建或更新数据，根据fraud_bool决定是否增加欺诈历史计数，并添加rb_id到历史记录
        """
        query = {"MBR_NO": mbr.MBR_NO}
        mbrs_dict = mbr.model_dump()

        # 准备更新数据，排除历史计数相关字段
        new_data = {k: v for k, v in mbrs_dict.items() 
                    if k not in ["all_history", "fraud_history", "rb_history"]}
        
        # 构建更新操作
        update_operations = {
            "$set": new_data,
            "$inc": {
                "all_history": 1,  # 总是增加总历史计数
                "fraud_history": 1 if fraud_bool else 0  # 欺诈标志为True时增加欺诈历史
            },
            "$push": {"rb_history": rb_id}  # 添加rb_id到历史记录列表
        }
        
        """
        不要使用initial_values，在创建新值时使用，$inc会冲突，它本身就会创建
        """
        # 当插入新文档时，确保初始值正确
        # initial_values = {
        #     "all_history": 0,
        #     "fraud_history": 0,
        #     "rb_history": []
        # }
        
        # 执行更新操作（如果文档不存在则创建，并设置初始值）
        await self.collection.update_one(
            query,
            {
                "$set": update_operations["$set"],
                "$inc": update_operations["$inc"],
                "$push": update_operations["$push"],
                # "$setOnInsert": initial_values  # 仅在插入新文档时设置初始值
            },
            upsert=True
        )

        return await self.get_by_mbr_no(mbr.MBR_NO)